package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Random;

public class Serveur {
	String fic = "C:/Users/nico/Desktop/video.mp4";
	File fichier = new File (fic);
	byte[][]unencodedFile=null;
	byte[][]encodedFile=null;
	public Serveur(){
		System.out.println("demarrage du Serveur");
		System.out.println("Longueur du fichier traité: "+fichier.length());
		unencodedFile=new byte [(int) fichier.length()/32+1][32];
		encodedFile=new byte [(int) fichier.length()/32+1][40];
		try {
			System.out.println("Appel de connect()");
			System.out.println("Appel de cutFile()");
			cutFile();
			System.out.println("Appel de encodeFile()");
			encodeFile(unencodedFile);
			System.out.println("Appel de decodeFile()");
			decodeFile(encodedFile);
			System.out.println("Fin du programme");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
	public void cutFile() throws IOException{
		byte [] buffer = new byte [32];
		try {
			FileInputStream fis=new FileInputStream(fichier);
			int cpt =0;
			while ((fis.read(buffer, 0, 32))!=-1){
				unencodedFile[cpt]=buffer;
				buffer=new byte [32];
				cpt++;
			}
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	public int nbAlea(int nbMax){
		Random r = new Random();
		int valeur=r.nextInt(nbMax);
		return valeur;
	}
	public void encodeFile(byte [][] file){
		/**
		 * On choisit au hasard n paquets parmis K et
		 * on choisit au hasard n coefficient dans GF(2^8) 
		 * on envoi [n° paquet+ coeffeficient+ contenu ax + by + cz]
		 */
		/**
		 * Il faudrait envoyer encodedFile sous la forme de 3 packet à la fois
		 */
		for (int i=0; i<file.length; i++){
			int nbAlea1=0;
			int nbAlea2=0;
			/**
			 * On pourrait mettre un tableau des nombres tirés
			 * pour ne pas tiré deux fois le même nombre 
			 * mais on perd l'intéret de l'aléatoire 
			 */
			nbAlea1=nbAlea(file.length);
			nbAlea2=nbAlea(file.length);
			while (nbAlea2==nbAlea1){
				nbAlea2=nbAlea(file.length);
			}
			byte[] membre1=file[nbAlea1];
			byte[] membre2=file[nbAlea2];
			byte[]resultXor = new byte [32];
			for(int j=0; j<membre1.length; j++){
				 resultXor[j]= (byte) (membre1[j]^membre2[j]);
			}
			/**
			 * numéro de packet = coefficient ==> moins de données à envoyer
			 */
		
			ByteBuffer bb=ByteBuffer.allocate(encodedFile[i].length);
			bb.putInt(nbAlea1).array();
			bb.putInt(nbAlea2).array();
			bb.put(resultXor);
			//System.out.println(" position : "+bb.position());
			//System.out.println("bb lenght : "+bb.capacity());
			//System.out.println("encodedFile[i] lenght : "+encodedFile[i].length);
			bb.clear();
			bb.get(encodedFile[i], 0, bb.capacity());
			//System.out.println("encode file content : "+encodedFile[i]);
			
		}
	}
	public void decodeFile(byte[][]file){
		/**
		 * 1) Former la matrice (A|B) = [K|data]
		 * 2) pivot de gausse sur GF(2^8) : verififier si possible
		 * 3) reconstruction fichier
		 */
		
		/**
		 * Former matrice
		 * [nb1  nb2 |dataXor]
		 * [nb3  nb4 |dataXor]
		 * ... 
		 */
		int nb1 = 0;
		int nb2=0;
		byte[] data = new byte [32];
		int [][] matA = new int [file.length][2];
		int [][]matB = new int [file.length][1];
		for(int i=0; i<file.length; i++){
			ByteBuffer bb = ByteBuffer.wrap(file[i]);
			//System.out.println("bb lenght "+bb.capacity());
			nb1=bb.getInt();
			nb2=bb.getInt();
			matA[i][0]=nb1;
			matA[i][1]=nb2;
			for (int j=0; j<8; j++){
				System.out.println("bb.getInt("+j + ") = "+bb.getInt());
			}
			//bb.get(data, 0, data.length);
			
			System.out.println("Decode - Forme matrice : nb 1= "+nb1+" nb2= "+nb2);
			
			
		}
		/**
		 * Reconstruction du fichier à partir du pivot de gauss
		 */
		File fic = new File("C:/Users/nico/Desktop/toto.mp4");
		FileOutputStream fos=null;
		try {
			fos = new FileOutputStream(fic);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		for(int i=0; i<file.length; i++){
			try {
				fos.write(file[i]);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
